package com.junbao.message.application.service;

import java.util.Date;
import java.util.List;

import com.junbao.message.domain.model.NotifyMessage;
import com.junbao.message.infrastructure.page.DataQuereyCondition;

public interface MessageService {

	/**
	 * 预存储发送消息 将消息预存储在消息系统，并不直接发送至目标系统
	 * @param notifyMessage 消息
	 * @return 消息序列
	 */
	public void reserveSendMessage(NotifyMessage notifyMessage);
	
	/**
	 * 确认发送消息  将预存储的消息发送至目标系统
	 * @param NotifyMessage 消息
	 * @return
	 */
	public void confirmSendMessage(NotifyMessage NotifyMessage);
	
	/**
	 * 存储并直接发送消息 直接将消息发送至目标系统
	 * @param notifyMessage 消息
	 * @return
	 */
	public void sendMessage(NotifyMessage notifyMessage); 
	
	/**
	 * 消息确认 调用主动方应用确认消息是否可发送
	 * @param notifyMessage 消息信息
	 */
	public void confirmMessage(NotifyMessage notifyMessage);
	
	/**
	 * 消息ACK确认 被动方消息处理完成，调用消息系统完成消息已消费确认
	 * @param notifyMessage 消息信息
	 */
	public void ackConfirmMessage(NotifyMessage notifyMessage);
	
	/**
	 * 消息重发
	 * @param notifyMessage 消息信息
	 */
	public void retryMessage(NotifyMessage notifyMessage);
	
	/**
	 * 
	 * 查询待确认消息 
	 * @return
	 */
	public List<NotifyMessage> queryWaitConfirmMessage(Date conditionTime);
	/**
	 * 查询待发送消息
	 * @param date 
	 * @return
	 */
	public List<NotifyMessage> queryWaitSendMessage(Date conditionTime);
	/**
	 * 根据消息序列查询消息
	 * @param messageSquece 消息序列
	 * @return
	 */
	public NotifyMessage queryMessageByMessageSquece(String messageSquece);
	/**
	 * 根据消息编号查询消息
	 * @param messageNo 消息编号
	 * @return
	 */
	public NotifyMessage queryMessageByMessageNo(String messageNo);
	/**
	 * 更新待通知消息状态为待确认
	 * @return
	 */
	public void updateStatusToWaitConfirm();
	/**
	 * 更新超过重试次数的消息为死亡消息
	 * @return
	 */
	public void updateMessageToDead();
	/**
	 * 更新消息为死亡
	 * @param messageSquece 消息序列
	 * @return
	 */
	public void updateMessageToDead(NotifyMessage message);
	
	/**
	 * 查询待移除的总记录数
	 */
	public int queryWaitRemvalTotalCount(DataQuereyCondition condition);
	
	/**
	 * 查询待移除消息
	 * @param dataQuereyCondition 条件
	 * @return
	 */
	public List<NotifyMessage> queryWaitRemovalMessages(DataQuereyCondition condition);
	
	/**
	 * 添加消息到历史表
	 * @param notifyMessages
	 */
	public void addWaitMessageToHistory(List<NotifyMessage> notifyMessages);
	
	/**
	 * 删除消息中已经移除的消息
	 * @param condition
	 */
	public void deleteRemovaledMessageFromMessage(DataQuereyCondition condition);

	/**
	 * 更新待发送消息状态为发送中
	 * @param conditionTime 时间条件
	 */
	int updateWaitSendMessageStatusToSending(Date conditionTime);

	/**
	 * 将待确认消息改为确认中
	 * @param conditionTime
	 */
	public int updateWaitConfirmMessageStatusToConfriming(Date conditionTime);

	/**
	 * 将消息从确认中置为待确认
	 */
	public void messageStatusToWaitConfirmFromConfirmingUpdate();

	/**
	 * 将消息从发送中置为待发送
	 */
	public void messageStatusToWaitSendFromSendingUpdate();
}
